//package com.openlogic.common.datasource.handler;
//
//import java.util.ArrayList;
//import java.util.List;
//
//import org.noear.solon.annotation.Component;
//import org.noear.solon.annotation.Inject;
//import org.noear.solon.core.aspect.Interceptor;
//import org.noear.solon.core.aspect.Invocation;
//
//import com.baomidou.mybatisplus.solon.plugins.handler.TenantLineHandler;
//import com.openlogic.common.core.constants.basic.TenantConstants;
//import com.openlogic.common.core.enums.DictEnum;
//import com.openlogic.common.datasource.annotation.IgnoreTenant;
//import com.openlogic.common.datasource.config.properties.TableProperties;
//import com.openlogic.common.security.utils.SecurityUtil;
//
//import cn.hutool.core.util.ArrayUtil;
//import cn.hutool.core.util.ObjectUtil;
//import net.sf.jsqlparser.expression.CaseExpression;
//import net.sf.jsqlparser.expression.Expression;
//import net.sf.jsqlparser.expression.HexValue;
//import net.sf.jsqlparser.expression.StringValue;
//import net.sf.jsqlparser.expression.WhenClause;
//import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
//import net.sf.jsqlparser.schema.Column;
//import net.sf.jsqlparser.util.cnfexpression.MultipleExpression;
//
///**
// * @ClassName: OpenLogicTenantLineHandler
// * @Description: MyBatisPlus拦截xml的sql语句，增加租户id
// * @author weiyongpeng
// * @date 2025年2月1日 上午8:06:58
// */
//@Component
//public class OpenLogicTenantLineHandler implements TenantLineHandler, Interceptor {
//	
//    /**
//     * 通过ThreadLocal记录租户控制相关的属性值
//     */
//    public ThreadLocal<IgnoreTenant> threadLocal = new ThreadLocal<>();
//    
//	private static final String BACKQUOTE = "`";
//
//	@Inject
//	TableProperties properties;
//
//	/**
//	 * ==========================MyBatis-xml的手写Sql处理【开始】======================================
//	 */
//
//	/**
//	 * 租户表租户控制
//	 * @return 租户值
//	 */
//	@Override
//	public Expression getTenantId() {
//		// 防止gbase数据库等对Varchar类型参数采用严格模式 必须要加上''
//		return new HexValue("'" + SecurityUtil.getEnterpriseId() + "'");
//	}
//
//	/**
//	 * 描述：公共表租户控制 | insert
//	 * @Title: getMixTenantId
//	 * @return
//	 * @author weiyongpeng
//	 * @date 2025年1月31日 下午8:56:08
//	 */
//	public Expression getMixTenantId() {
//		// 以下代码临时注释
//		CaseExpression caseExpression = new CaseExpression();
//		WhenClause commonCase = new WhenClause();
//		commonCase.setWhenExpression(new EqualsTo(new HexValue(SecurityUtil.getIsCommon()),
//				new StringValue(DictEnum.DicCommonPrivate.COMMON.getCode())));
//		commonCase.setThenExpression(new HexValue(TenantConstants.COMMON_TENANT_ID));
//		caseExpression.setSwitchExpression(commonCase);
//		caseExpression.setElseExpression(this.getTenantId());
//		return caseExpression;
//	}
//
//	/**
//	 * 描述：公共表租户控制 | select
//	 * @Title: getCommonTenantId
//	 * @return
//	 * @author weiyongpeng
//	 * @date 2025年1月31日 下午8:55:55
//	 */
//	public MultipleExpression getCommonTenantId() {
//		List<Expression> childList = new ArrayList<>();
//		if (SecurityUtil.isNotEmptyTenant())
//			childList.add(new HexValue(TenantConstants.COMMON_TENANT_ID));
//		// 防止gbase数据库等对Varchar类型参数采用严格模式 必须要加上''
//		childList.add(new HexValue("'" + SecurityUtil.getEnterpriseId() + "'"));
//		return new MultipleExpression(childList) {
//
//			@Override
//			public String getStringExpression() {
//				return ",";
//			}
//		};
//	}
//
//	/**
//	 * 获取租户字段名
//	 * @return 租户字段名
//	 */
//	@Override
//	public String getTenantIdColumn() {
//		return TenantConstants.TENANT_ID;
//	}
//
//	/**
//	 * 忽略租户控制
//	 * @return 结果
//	 */
//	@Override
//	public boolean ignoreTable(String tableName) {
//		if (isExcludeTable(tableName)) {
//			return true;
//		} else {
//			IgnoreTenant tenantIgnore = threadLocal.get();
//            return ObjectUtil.isNotNull(tenantIgnore) && tenantIgnore.value();
//		}
//	}
//
//	/**
//	 * 描述：描述：判断是否为非租户表
//	 * @Title: isExcludeTable
//	 * @param tableName
//	 * @return
//	 * @author weiyongpeng
//	 * @date 2025年2月1日 上午8:06:34
//	 */
//	public boolean isExcludeTable(String tableName) {
//		return ArrayUtil.contains(properties.getIgnoreTenantTable().toArray(),
//				tableName.toLowerCase().replaceAll(BACKQUOTE, ""));
//	}
//
//	/**
//	 * 忽略租户控制
//	 * @return 结果
//	 */
//	@Override
//	public boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {
//		return TenantLineHandler.super.ignoreInsert(columns, tenantIdColumn);
//	}
//
//	/**
//	 * 描述：判断是否为公共表
//	 * @Title: isCommonTable
//	 * @param tableName
//	 * @return
//	 * @author weiyongpeng
//	 * @date 2025年2月1日 上午6:52:20
//	 */
//	public boolean isCommonTable(String tableName) {
//		return ArrayUtil.contains(properties.getCommonTenantTable().toArray(), tableName.toLowerCase().replaceAll(BACKQUOTE, ""));
//	}
//	/**
//	 * ==========================MyBatis-xml的手写Sql处理【结束】======================================
//	 */
//
//	@Override
//	public Object doIntercept(Invocation inv) throws Throwable {
//		IgnoreTenant controllerTenantIgnore = inv.method().getAnnotation(IgnoreTenant.class);
//			try {
//				if (controllerTenantIgnore != null) {
//					// 处理前
//					threadLocal.set(controllerTenantIgnore);
//					// 执行业务处理
//					return inv.invoke();
//				}
//			} finally {
//				threadLocal.remove();
//			}
//		return null;
//	}
//
//}
